package com.sa.satoken.common.service;

import cn.dev33.satoken.stp.StpInterface;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.ArrayList;
import java.util.List;

/**
 * 自定义权限加载接口实现类
 * 加载权限列表的数据源应该是多级缓存机制（ 本地缓存--> 分布式缓存--> 数据库 ）
 * @author Architecture Station
 * @version 1.0
 * @website
 */
public class StpInterfaceImpl implements StpInterface {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 返回一个账号所拥有的权限码集合
     */
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        List<String> roleList = getRoleList(loginId, loginType);
        // 遍历角色列表
        if (roleList != null && roleList.size() > 0) {
            List<String> permissionList = new ArrayList<>();
            for (String roleName : roleList) {
                String roleKey = "role-permissions-"+roleName;
                if (redisTemplate.hasKey(roleKey)) {
                    permissionList.addAll((List<String>) redisTemplate.opsForValue().get(roleKey));
                }
            }
            return permissionList;
        }
        return new ArrayList<>();
    }

    /**
     * 返回一个账号所拥有的角色标识集合 (权限与角色可分开校验)
     */
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        String userRolesKey = "user-roles-"+loginId;
        if (redisTemplate.hasKey(userRolesKey)) {
            return (List<String>) redisTemplate.opsForValue().get(userRolesKey);
        }
        return new ArrayList<>();
    }
}











